import asyncio
from pyVim.connect import SmartConnectNoSSL, Disconnect
from pyVmomi import vim
import atexit
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

async def get_esxi_vm_list(host_name: str) -> dict:
    """
    异步查询指定 ESXi 宿主机上的虚拟机列表

    参数:
    - host_name: ESXi 宿主机的名称或 IP 地址

    返回:
    - dict: 包含查询结果的字典，格式如下：
      {
        "success": bool,  # 查询是否成功
        "message": str,   # 结果描述信息
        "vm_list": list   # 虚拟机信息列表，每项包含 name, power_state, ip_address, os
      }

    主要步骤:
    1. 通过环境变量读取 vCenter 连接信息
    2. 连接 vCenter，获取内容管理器
    3. 创建容器视图，查找所有 HostSystem 对象
    4. 查找指定名称的 ESXi 宿主机
    5. 获取宿主机上的所有虚拟机，提取关键信息
    6. 返回虚拟机列表及状态信息
    """
    def sync_get_esxi_vm_list(host_name_sync: str) -> dict:
        result = {"success": False, "message": ""}
        try:
            # 获取 vCenter 配置
            vcenter_host = os.getenv("VCENTER_HOST")
            vcenter_user = os.getenv("VCENTER_USER")
            vcenter_password = os.getenv("VCENTER_PASSWORD")

            # 连接到 vCenter，禁用 SSL 验证
            si = SmartConnectNoSSL(
                host=vcenter_host,
                user=vcenter_user,
                pwd=vcenter_password,
                port=443
            )
            # 注册断开连接函数，确保退出时断开连接
            atexit.register(Disconnect, si)

            # 获取内容管理器
            content = si.RetrieveContent()

            # 创建容器视图，查找 HostSystem 对象
            container = content.viewManager.CreateContainerView(
                content.rootFolder,
                [vim.HostSystem],
                True
            )
            hosts = container.view

            # 查找指定的 ESXi 宿主机
            host = None
            for host_instance in hosts:
                if host_instance.name == host_name_sync:
                    host = host_instance
                    break

            if not host:
                result["message"] = f"未能找到名称为 {host_name_sync} 的 ESXi 宿主机"
                return result

            # 获取该宿主机上的所有虚拟机
            vms = host.vm
            vm_list = []
            if vms:
                for vm in vms:
                    vm_info = {
                        "name": vm.name,
                        "power_state": vm.summary.runtime.powerState,
                        "ip_address": vm.summary.guest.ipAddress if vm.summary.guest.ipAddress else "N/A",
                        "os": vm.summary.config.guestFullName
                    }
                    vm_list.append(vm_info)
            else:
                result["message"] = f"宿主机 {host_name_sync} 上没有找到虚拟机"
                return result

            # 构造结果
            result["success"] = True
            result["message"] = f"宿主机 {host_name_sync} 上的虚拟机列表:"
            result["vm_list"] = vm_list

        except Exception as e:
            result["message"] = f"发生错误: {str(e)}"

        return result

    # 使用线程池执行阻塞的同步函数，避免阻塞事件循环
    return await asyncio.get_event_loop().run_in_executor(None, sync_get_esxi_vm_list, host_name)

